<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>不要碰这些配置！ | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/dont-touch-these-settings.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/dont-touch-these-settings.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/dont-touch-these-settings.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/dont-touch-these-settings.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="administration.html">管理、监控和部署</a></span>
»
<span class="breadcrumb-link"><a href="deploy.html">部署</a></span>
»
<span class="breadcrumb-node">不要碰这些配置！</span>
</div>
<div class="navheader">
<span class="prev">
<a href="important-configuration-changes.html">« 重要配置的修改</a>
</span>
<span class="next">
<a href="heap-sizing.html">堆内存:大小和交换 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="dont-touch-these-settings"></a>不要碰这些配置！<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/510_Deployment/45_dont_touch.asciidoc">edit</a>
</h2>
</div></div></div>
<p>在 Elasticsearch 中有几个热点，人们似乎无法避免的要去调整。 我们理解的，所有的调整就是为了优化，但是这些调整，你<em>真的</em>不用去管。因为它们经常会被乱用，从而造成系统的不稳定或者糟糕的性能，甚至两者都有可能。</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_垃圾回收器"></a>垃圾回收器 (Garbage Collector)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/510_Deployment/45_dont_touch.asciidoc">edit</a>
</h3>
</div></div></div>
<p>前面已经在<a class="xref" href="_monitoring_individual_nodes.html#garbage_collector_primer" title="垃圾回收入门">垃圾回收入门</a>中简要介绍了，JVM 使用一个垃圾回收器来释放不再使用的内存。

这个提示实际上是对上一个提示的扩展，但是值得强调的是：</p>

<p>不要更改默认的垃圾回收器！</p>

<p>Elasticsearch 默认的垃圾回收器(GC)是 Concurrent-Mark and Sweep (CMS)。 这个垃圾回收器可以和应用并行处理，以便它可以最小化停顿。
然而，它有两个 <b>停止一切</b>(stop-the-world) 阶段，回收很大的堆内存也有点吃力。</p>

<p>尽管有这些缺点，它还是目前对于像 Elasticsearch 这样低延迟需求软件的最佳垃圾回收器。官方建议使用 CMS。</p>

<p>现在有一个新的垃圾回收器，叫 G1垃圾回收器(Garbage First GC, G1GC )。 这款新 GC 的设计旨在最小化暂停时间, 甚至比 CMS 还要小，并具有对大内存的处理能力。

它的工作方式是将堆内存划分成很多区域，并预测哪些区域包含最有可能收回的空间。

通过优先收集这些区域(<em>垃圾优先, garbage first</em>)， 可以最小化暂停时间，并能在非常大的堆内存上运行。</p>

<p>听起来很棒！遗憾的是，G1GC 还是太新了，经常发现新的 bug。

这些错误通常属于分段(segfault)故障类型，并会导致硬崩溃(hard crash)。
Lucene 的测试套件对垃圾回收算法要求严格，看起来这些缺陷 G1GC 并没有很好地解决。</p>

<p>我们希望有一天会推荐使用 G1GC，但就目前而言，它还不够稳定，无法满足 Elasticsearch 和 Lucene 的要求。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_线程池"></a>线程池 (Threadpools)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/510_Deployment/45_dont_touch.asciidoc">edit</a>
</h3>
</div></div></div>
<p>许多人 <em>喜欢</em> 调整线程池。 

无论什么原因，人们都对增加线程数无法抗拒。

索引太多了？增加线程！搜索太多了？增加线程！节点空闲率95％？增加线程！</p>

<p>Elasticsearch 默认的线程设置已经是很合理的了。对于所有的线程池（除了 <code class="literal">搜索(search)</code> ），线程个数是根据 CPU 核心数设置的。

如果你有 8 个核，你可以同时运行的线程只有 8 个，只给任何特定的线程池分配 8 个线程是有意义的。</p>

<p>搜索(search)线程池设置的大一点，配置为 <code class="literal">int((核心数 * 3) / 2) + 1</code> 。</p>

<p>你可能会认为某些线程可能会阻塞（如磁盘上的 I／O 操作），所以你才想加大线程的。

对于 Elasticsearch 来说这并不是一个问题：因为大多数 I／O 操作是由 Lucene 管理的线程处理的，而不是 Elasticsearch。</p>

<p>此外，线程池通过相互传递工作进行协作。

你不必再因为它正在等待磁盘写操作而担心网络线程阻塞，
因为网络线程早已把这个工作交给另外的线程池，并返回到网络中。</p>

<p>最后，你的处理器的计算能力是有限的，拥有更多的线程会导致你的处理器频繁切换线程上下文。

一个处理器同时只能运行一个线程，所以当它需要切换到一个不同的线程时，它会存储当前的状态（寄存器等等），然后加载另外一个线程。

如果幸运的话，这个切换发生在同一个核心。如果不幸的话，这个切换可能发生在不同的核心，这就需要在内核总线上进行传输。</p>

<p>这个上下文的切换，会给 CPU 时钟周期带来管理调度的开销；在现代的 CPU 上，开销估计高达 30 μs。

也就是说，除非线程被阻塞超过 30 μs，否则很可能时间会更好的花在处理上，并提前完成。</p>

<p>人们经常稀里糊涂的设置线程池的值。8 核的 CPU，我们遇到过有人配了 60、100 甚至 1000 个线程。
这些设置只会让 CPU 瞎忙活，而不是去完成真正的工作。</p>

<p>所以，下此如果你想调整线程池的线程数，请不要这样做。如果你<em>真的无法拒绝</em> ，
一定要关注你的 CPU 核心数，最多设置成核心数的两倍，再多了都是浪费。</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="important-configuration-changes.html">« 重要配置的修改</a>
</span>
<span class="next">
<a href="heap-sizing.html">堆内存:大小和交换 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>